<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="Stylesheet" type="text/css" href="style.css">
<title>sed</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

<h1 id="toc_1"><a href="http://www.grymoire.com/Unix/sed.html ">a tutorial for sed </a></h1>
<ol>
<li>
s command (ie. substitute)
<pre  sh>
	sed s/day/night/ &lt;old &gt;new
</pre>

<li>
using "&amp;" as the matched string,
<pre  sh>
 	sed 's/[a-z]*/(&amp;)/' &lt;old &gt;new
	# 添加括号
</pre>

<li>
使用-r 选项来开启extended regex（gnu），max / freebsd使用-E

<li>
使用\1来保存pattern中的一部分(用"\("和"\)"隔住的)

<li>
sed pattern flags

<ul>
<li>
/g  global replacement

<li>
/1,/2,etc. Specifying which occurrence
<pre sh>
			sed 's/[a-zA-Z]* //2' &lt;old &gt;new #删除第二个匹配上的
			sed 's/[a-zA-Z]* //2g' &lt;old &gt;new #删除第二个匹配上及其以后的
</pre>

<li>
/p  print, sed默认print每一行，若有某行被替换了，会打印替换后的， 使用-n选项的话,默认不打印，只有使用/p选项才会打印新行

<li>
/w filename,将修改写入某个文件

<li>
/I GNU，ignore case

<li>
pattern flags之间可以相互组合（如果有意义的话），但是/w必须是最后一个

</ul>
<li>
-e command，在每个command前加上-e选项，来使用多命令

<li>
sed address

<ul>
<li>
/PATTERN/ address，sed可以在指定行上操作，只需将address放在command之前
<pre sh>
			sed '/PATTERN/p' file  # 匹配PATTERN行会被打印两次
			sed -n '/PATTERN/p' file  #类似grep
			# 在pattern address中，若想改变/分隔符，if the expression starts with a backslash, the next character 	is the delimeter,
			sed '\,^#, s/[0,9][0-9]*//'  #替换所有以#开头的行的首个数字
			# range by patterns
			sed '/start/,/stop/ s/#.*//'

</pre>

<li>
最简单的是加上行号
<pre  sh>
			sed '3 s/[0-9][0-9]*//' &lt;file &gt;new  #删除第三行上的数字
			# 可以使用行号范围, $表示最后一行
			sed '1,$ s/A/a/'
			# 也可以合并数字和pattern
			sed '1,/start/ s/#.*//'
</pre>

</ul>
<li>
使用-f选项将许多sed command放到指定文件中
<pre sh>
sed -f sedscript &lt;old &gt;new
# sefdscript file
# ----
#  sed comment lower case  upper case,必须每行一条
s/a/A/g
s/e/E/g
</pre>

<li>
使用interpreter script
<pre sh>
#!/bin/sed -nf
s/a/A/g
s/e/E/g
</pre>

<li>
向sed中传递参数
<pre sh>
#!/bin/sh
sed -n 's/'"$1"'/&amp;/p'  #将$1用"括住是为了防止有空格
</pre>

<li>
delete with d
<pre sh>
	sed '11,$ d' &lt;file
	sed '1,/^$/ d' &lt;file
</pre>

<li>
print with p
<pre sh>
	sed 'p'  # 每行打印2次
	sed -n '1,10p' &lt;file  # 打印1～10
	# 可以使用!来inverts the address restrictions
	sed -n '1,10 !p' &lt;file # 打印除1～10行之外的
</pre>

<li>
q-- quti command,不能对一个地址范围

<li>
grouping with { and }
<pre sh>
#!/bin/sh
# This is a Bourne shell script that removes #-type comments
# between 'begin' and 'end' words.
sed -n '
	1,100 {
		/begin/,/end/ {
		     s/#.*//
		     s/[ ^I]*$//
		     /^$/ d
		     p
		}
	}
'
</pre>

<li>
writing a file with the "w" command

<li>
reading in a file with the "r" command

<li>
append a line with 'a' and insert a line with 'i', change a line with 'c'
<pre sh>
#!/bin/bash
sed '/WORD/ a\
Add this line after every line with WORD
'
sed '/WORD/ i\
Add this line before every line with WORD
'
sed '/WORD/ c\
replace every line with WORD with this line
'
</pre>

<li>
print line number with =
<pre sh>
	# find the line number of PATTERN
	cat -n file | grep 'PATTERN' | awk '{print $1}'
	# or
	sed -n '/PATTERN/=' file
</pre>

</ol>

</body>
</html>
